package cn.git;

import net.bytebuddy.implementation.bind.annotation.AllArguments;
import net.bytebuddy.implementation.bind.annotation.Morph;
import net.bytebuddy.implementation.bind.annotation.RuntimeType;

public class UserManagerDynamicParamInterceptor {

    /**
     * 被标注 RuntimeType 注解的方法就是拦截方法，此时返回的值与返回参数可以与被拦截的方法不一致
     * byteBuddy会在运行期间给被拦截的方法参数进行赋值
     * @return
     */
    @RuntimeType
    public Object diffNameMethod(
            // 被拦截的目标方法参数,拦截实例方法以及静态方法有效
            @AllArguments Object[] targetMethodArgs,
            // 用于调用目标方法
            @Morph MyCallable myCallable) {
        Object call;
        try {
            // 不可以使用 targetMethod.invoke 会引起递归调用
            if (targetMethodArgs != null && targetMethodArgs.length > 0) {
                targetMethodArgs[0] = Long.valueOf(targetMethodArgs[0].toString()) + 1;
            }
            call = myCallable.call(targetMethodArgs);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return call;
    }

}
